#ifndef DATA_H
#define DATA_H

#include "bool.h"

typedef struct sdata * data;

data 
data_empty(void);
/*
  DESC: Construye un dato vacio. 
  PRE: { True }
  d = data_empty();
  POS: {  Hay memoria ==> d --> empty 
  ! Hay memoria ==> d == NULL }
*/

data 
data_destroy(data d);
/*
  DESC: Destructor del tipo. d cambia.
  PRE: { d --> D }
  d = data_destroy(d);
  POS: { Se destruye D /\ d == NULL }
*/

bool 
data_copyStr(data d,const char *s);
/*
  DESC: Transforma el string en dato y lo copia d. 
  Devuelve False si no hay memoria.
  PRE: { d --> D /\ s --> S }
  b = data_copyStr(d,s);  
  POS: {  Hay memoria ==>  b /\ d --> fromStr(S)   
  ! Hay memoria ==> !b /\ d --> D }   
*/

char *
data_toStr(const data d);
/*
  DESC: Devuelve un nuevo string (despues de usarlo hay que liberarlo) que 
  representa al dato. 
  PRE: { d --> D  /\ s = NULL }
  s = data_toStr(d);
  POS: {   Hay memoria ==> s --> toStr(S)  
  ! Hay memoria ==> s == NULL  }
*/

data 
data_clone(const data d);
/*
  DESC: Construye una copia.
  PRE: { d1 --> D1 /\ d2 = NULL }
  d2 = data_clone(d1);  
  POS: {  Hay memoria ==> d1 --> D1 /\ d2 --> D1 /\ d1 != d2 
  ! Hay memoria ==> d2 == NULL /\ d1 --> D1 }   
*/


#endif /* DATA_H */
